import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { Category } from 'src/types/category.interface';

@Injectable()
export class CategoryService {
  constructor(
    @InjectModel('Category') private categoryModel: Model<Category>,
  ) {}
  async find(query): Promise<Category[]> {
    return this.categoryModel.find(query).exec();
  }
  async create(
    createCategoryDTO: Category | Category[],
  ): Promise<Category | Category[]> {
    if (Array.isArray(createCategoryDTO)) {
      return this.categoryModel.insertMany(createCategoryDTO);
    } else {
      return new this.categoryModel(createCategoryDTO).save();
    }
  }
  // 返回前6个分类，以及每个分类下面的商品列表，每个分类下面会挂两个商品
  async findCategoriesWithProducts(): Promise<Category[]> {
    return this.categoryModel
      .aggregate([
        {
          $sort: { order: 1 }, // 按序号正序排列
        },
        {
          $limit: 2, // 限制结果为2条
        },
        {
          // 使用$graphLookup进行深度递归查询，获取所有的后代分类
          $graphLookup: {
            from: 'categories', // 要从哪个集合中查找
            startWith: '$_id', // 从当前文档中的哪个字段开始查 手机ID 665dcb4f5051182f496cb473
            connectFromField: '_id',
            connectToField: 'parent',
            as: 'allDescendants', // 把查询到的文档保存到什么地方
          },
        },
        {
          $addFields: {
            allCategoryIds: {
              // 把找到的子类的文档全部取出，每个文档依次进行映射得到文档的ID，也就是分类的ID，变成分类数组
              $map: {
                input: '$allDescendants',
                as: 'item',
                in: '$$item._id',
              },
            },
          },
        },
        {
          $lookup: {
            from: 'products', // 从商品表里查询
            let: { allCatIds: '$allCategoryIds' },
            pipeline: [
              {
                $match: {
                  $expr: {
                    // 看看此商品的分类ID是否在子分类ID的数组里
                    $in: ['$category', '$$allCatIds'],
                  },
                },
              },
              {
                $sort: { order: -1 }, // 先按商品序号降序排列
              },
              {
                $limit: 2, // 取前2条
              },
            ],
            as: 'products',
          },
        },
        {
          $project: {
            // 指定返回的字段
            _id: 0,
            order: 1,
            name: 1,
            products: 1,
          },
        },
      ])
      .exec();
  }
}

/**
 $limit之后得到了这两个分类文档对象
 {'name': '手机', '_id': 'abc' },
 {'name': '穿戴', '_id': 'def' },

 _id 手机ID adbadafasdasd
 找那个分类的parent字段等于 adbadafasdasd
 会找到5个文档，它们的父ID是 adbadafasdasd
 再获取到这5个文档的_id
 */
